{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Taxi fare Keras Feature Columns (playground).ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/GoogleCloudPlatform/training-data-analyst/blob/master/courses/fast-and-lean-data-science/08_Taxifare_Keras_FeatureColumns_playground.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "metadata": {
        "id": "fIvCMy8TH170",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Keras Feature Columns are not an officially released feature yet. Some caveats apply: please run this notebook on a GPU Backend. Keras Feature Columns are not comaptible with TPUs yet. Also, you will not be able to export this model to Tensorflow's \"saved model\" format for serving. The serving layer for feature columns will be added soon.\n"
      ]
    },
    {
      "metadata": {
        "id": "8g9DaHx7HFtl",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Imports"
      ]
    },
    {
      "metadata": {
        "id": "4RmX7O1HBoFE",
        "colab_type": "code",
        "outputId": "611158f2-57da-4d80-bbc8-cfba5b75671a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "cell_type": "code",
      "source": [
        "import os, json, math\n",
        "import numpy as np\n",
        "import tensorflow as tf\n",
        "from tensorflow.python.feature_column import feature_column_v2 as fc  # This will change when Keras FeatureColumn is final.\n",
        "from matplotlib import pyplot as plt\n",
        "print(\"Tensorflow version \" + tf.__version__)\n",
        "tf.enable_eager_execution()"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Tensorflow version 1.12.0\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "k4565fhT0hRn",
        "colab_type": "code",
        "cellView": "form",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "#@title display utilities [RUN ME]\n",
        "# utility to display training and validation curves\n",
        "def display_training_curves(training, validation, title, subplot):\n",
        "  if subplot%10==1: # set up the subplots on the first call\n",
        "    plt.subplots(figsize=(10,10), facecolor='#F0F0F0')\n",
        "    plt.tight_layout()\n",
        "  ax = plt.subplot(subplot)\n",
        "  ax.set_facecolor('#F8F8F8')\n",
        "  ax.plot(training)\n",
        "  ax.plot(validation)\n",
        "  ax.set_title('model '+ title)\n",
        "  ax.set_ylabel(title)\n",
        "  ax.set_xlabel('epoch')\n",
        "  ax.legend(['train', 'valid.'])"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "iBn9AycUKk2U",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Colab-only auth"
      ]
    },
    {
      "metadata": {
        "id": "RTVUYJiZKoRc",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# backend identification\n",
        "IS_COLAB = 'COLAB_GPU' in os.environ  # this is always set on Colab, the value is 0 or 1 depending on GPU presence\n",
        "HAS_COLAB_TPU = 'COLAB_TPU_ADDR' in os.environ\n",
        "\n",
        "# Auth on Colab\n",
        "if IS_COLAB:\n",
        "  from google.colab import auth\n",
        "  auth.authenticate_user()\n",
        "  \n",
        "# Also propagate the Auth to TPU if available so that it can access your GCS buckets\n",
        "if IS_COLAB and HAS_COLAB_TPU:\n",
        "  TF_MASTER = 'grpc://{}'.format(os.environ['COLAB_TPU_ADDR'])\n",
        "  with tf.Session(TF_MASTER) as sess:    \n",
        "    with open('/content/adc.json', 'r') as f:\n",
        "      auth_info = json.load(f) # Upload the credentials to TPU.\n",
        "    tf.contrib.cloud.configure_gcs(sess, credentials=auth_info)\n",
        "  print('Using TPU')\n",
        "\n",
        "# TPU usage flag\n",
        "USE_TPU = HAS_COLAB_TPU"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "4OXx6ozUHzPd",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Config"
      ]
    },
    {
      "metadata": {
        "id": "asbCdV0iH1z8",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "DATA_BUCKET = \"gs://cloud-training-demos/taxifare/ch4/taxi_preproc/\"\n",
        "TRAIN_DATA_PATTERN = DATA_BUCKET + \"train*\"\n",
        "VALID_DATA_PATTERN = DATA_BUCKET + \"valid*\""
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "EuDURqOPJiQ2",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "CSV_COLUMNS = ['fare_amount', 'dayofweek', 'hourofday', 'pickuplon','pickuplat','dropofflon','dropofflat','passengers', 'key']\n",
        "DEFAULTS = [[0.0], ['null'], [12], [-74.0], [40.0], [-74.0], [40.7], [1.0], ['nokey']]\n",
        "\n",
        "def decode_csv(line):\n",
        "  column_values = tf.decode_csv(line, DEFAULTS)\n",
        "  column_names = CSV_COLUMNS\n",
        "  decoded_line = dict(zip(column_names, column_values)) # create a dictionary {'column_name': value, ...} for each line  \n",
        "  return decoded_line\n",
        "\n",
        "def load_dataset(pattern):\n",
        "  #filenames = tf.gfile.Glob(pattern)\n",
        "  filenames = tf.data.Dataset.list_files(pattern)\n",
        "  #dataset = tf.data.TextLineDataset(filenames)\n",
        "  dataset = filenames.interleave(tf.data.TextLineDataset, cycle_length=16)  # interleave so that reading happens from multiple files in parallel\n",
        "  dataset = dataset.map(decode_csv)\n",
        "  return dataset"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "bSleDYsrNXzs",
        "colab_type": "code",
        "outputId": "1ca24e36-ac9b-46fd-e2d3-bfa2e432740e",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 241
        }
      },
      "cell_type": "code",
      "source": [
        "dataset = load_dataset(TRAIN_DATA_PATTERN)\n",
        "for n, data in enumerate(dataset):\n",
        "  numpy_data = {k: v.numpy() for k, v in data.items()} # .numpy() works in eager mode\n",
        "  print(numpy_data)\n",
        "  if n>10: break"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "{'fare_amount': 2.5, 'dayofweek': b'Thu', 'hourofday': 0, 'pickuplon': -73.97609, 'pickuplat': 40.764126, 'dropofflon': -73.97421, 'dropofflat': 40.763348, 'passengers': 1.0, 'key': b'2010-03-18 00:02:09.000000-73.976140.764140.7633-73.9742'}\n",
            "{'fare_amount': 2.5, 'dayofweek': b'Wed', 'hourofday': 0, 'pickuplon': -74.00178, 'pickuplat': 40.735416, 'dropofflon': -74.00195, 'dropofflat': 40.734978, 'passengers': 1.0, 'key': b'2014-03-05 00:07:00.000000-74.001840.735440.735-74.002'}\n",
            "{'fare_amount': 5.3, 'dayofweek': b'Wed', 'hourofday': 22, 'pickuplon': -74.00663, 'pickuplat': 40.71627, 'dropofflon': -73.99982, 'dropofflat': 40.731148, 'passengers': 1.0, 'key': b'2010-12-22 22:44:00.000000-74.006640.716340.7311-73.9998'}\n",
            "{'fare_amount': 4.1, 'dayofweek': b'Sun', 'hourofday': 11, 'pickuplon': -73.98547, 'pickuplat': 40.759377, 'dropofflon': -73.99159, 'dropofflat': 40.75146, 'passengers': 1.0, 'key': b'2009-07-05 11:04:32.000000-73.985540.759440.7515-73.9916'}\n",
            "{'fare_amount': 19.0, 'dayofweek': b'Sat', 'hourofday': 8, 'pickuplon': -74.006165, 'pickuplat': 40.7051, 'dropofflon': -73.980095, 'dropofflat': 40.75247, 'passengers': 2.0, 'key': b'2013-03-09 08:30:00.000000-74.006240.705140.7525-73.9801'}\n",
            "{'fare_amount': 10.9, 'dayofweek': b'Tue', 'hourofday': 16, 'pickuplon': -73.9871, 'pickuplat': 40.72528, 'dropofflon': -73.99647, 'dropofflat': 40.75305, 'passengers': 1.0, 'key': b'2012-05-29 16:16:03.000000-73.987140.725340.7531-73.9965'}\n",
            "{'fare_amount': 16.1, 'dayofweek': b'Sun', 'hourofday': 15, 'pickuplon': -74.0107, 'pickuplat': 40.710037, 'dropofflon': -73.96543, 'dropofflat': 40.75697, 'passengers': 2.0, 'key': b'2009-05-03 15:51:13.000000-74.010740.7140.757-73.9654'}\n",
            "{'fare_amount': 6.5, 'dayofweek': b'Wed', 'hourofday': 6, 'pickuplon': -74.010414, 'pickuplat': 40.72008, 'dropofflon': -74.008514, 'dropofflat': 40.707844, 'passengers': 1.0, 'key': b'2013-09-04 06:34:00.000000-74.010440.720140.7078-74.0085'}\n",
            "{'fare_amount': 15.5, 'dayofweek': b'Fri', 'hourofday': 19, 'pickuplon': -73.971924, 'pickuplat': 40.745842, 'dropofflon': -74.00344, 'dropofflat': 40.732437, 'passengers': 1.0, 'key': b'2015-02-06 19:48:43.000000-73.971940.745840.7324-74.0034'}\n",
            "{'fare_amount': 2.5, 'dayofweek': b'Fri', 'hourofday': 0, 'pickuplon': -73.99397, 'pickuplat': 40.75142, 'dropofflon': -73.99095, 'dropofflat': 40.755474, 'passengers': 1.0, 'key': b'2014-08-29 00:29:00.000000-73.99440.751440.7555-73.991'}\n",
            "{'fare_amount': 7.3, 'dayofweek': b'Thu', 'hourofday': 14, 'pickuplon': -73.825165, 'pickuplat': 40.745167, 'dropofflon': -73.82816, 'dropofflat': 40.75099, 'passengers': 5.0, 'key': b'2010-05-13 14:53:00.000000-73.825240.745240.751-73.8282'}\n",
            "{'fare_amount': 2.5, 'dayofweek': b'Sun', 'hourofday': 0, 'pickuplon': -73.9714, 'pickuplat': 40.745632, 'dropofflon': -73.97146, 'dropofflat': 40.74553, 'passengers': 2.0, 'key': b'2009-05-03 00:27:00.000000-73.971440.745640.7455-73.9715'}\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "xYZzTbmAVTWn",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "def add_engineered(features):\n",
        "    # this is how you can do feature engineering in TensorFlow\n",
        "    distance = tf.sqrt((features['pickuplat'] - features['dropofflat'])**2 +\n",
        "                       (features['pickuplon'] - features['dropofflon'])**2)\n",
        "    \n",
        "    # euclidian distance is hard for a neural network to emulate\n",
        "    features['euclidean'] = distance\n",
        "    return features\n",
        "\n",
        "def features_and_labels(features):\n",
        "  features = add_engineered(features)\n",
        "  features.pop('key') # this column not needed\n",
        "  label = features.pop('fare_amount') # this is what we will train for\n",
        "  return features, label\n",
        "  \n",
        "def prepare_dataset(dataset, batch_size, truncate=None, shuffle=True):\n",
        "  dataset = dataset.map(features_and_labels)\n",
        "  if truncate is not None:\n",
        "    dataset = dataset.take(truncate)\n",
        "  dataset = dataset.cache()\n",
        "  if shuffle:\n",
        "    dataset = dataset.shuffle(10000)\n",
        "  dataset = dataset.repeat()\n",
        "  dataset = dataset.batch(batch_size)\n",
        "  dataset = dataset.prefetch(-1) # prefetch next batch while training  (-1: autotune prefetch buffer size)\n",
        "  return dataset\n",
        "\n",
        "one_item = load_dataset(TRAIN_DATA_PATTERN).map(features_and_labels).take(1).batch(1)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "Q9Zf5ra8WZk_",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Linear Keras model [WORK REQUIRED]\n",
        "1. What do the columns do ? Familiarize yourself with these column types.\n",
        "\n",
        "`numeric_col = fc.`[`numeric_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/numeric_column)`('name')`\n",
        "\n",
        "`bucketized_numeric_col = fc.`[`bucketized_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/bucketized_column)`(fc.`[`numeric_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/numeric_column)`('name'), [0, 2, 10])`\n",
        "\n",
        "\n",
        "`indic_of_categ_col = fc.`[`indicator_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/indicator_column)`(fc.`[`categorical_column_with_identity`](https://www.tensorflow.org/api_docs/python/tf/feature_column/categorical_column_with_identity)`('name', num_buckets = 24))`\n",
        "\n",
        "`indic_of_categ_vocab_col = fc.`[`indicator_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/indicator_column)`(fc.`[`categorical_column_with_identity`](https://www.tensorflow.org/api_docs/python/tf/feature_column/categorical_column_with_vocabulary_list)`('color', vocabulary_list = ['red', 'blue']))` \n",
        "\n",
        "\n",
        "`indic_of_crossed_col = fc.`[`indicator_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/indicator_column)`(fc.`[`crossed_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/crossed_column)`([categcol1, categcol2], 16*16))`\n",
        "\n",
        "\n",
        "`embedding_of_crossed_col = fc.`[`embedding_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/embedding_column)`(fc.`[`crossed_column`](https://www.tensorflow.org/api_docs/python/tf/feature_column/crossed_column)`([categcol1, categcol2], 16*16), 5)`\n",
        "\n",
        "| column | output vector shape | nb of parameters |\n",
        "|--------------|---------------------------------|------------------------------|\n",
        "| numeric_col | [1] | 0 |\n",
        "| bucketized_numeric_col | [bucket boundaries+1] | 0 |\n",
        "| indic_of_categ_col | [nb categories] | 0 |\n",
        "| indic_of_categ_vocab_col | [nb categories] | 0 |\n",
        "| indic_of_crossed_col | [nb crossed categories] | 0 |\n",
        "| embedding_of_crossed_col | [nb crossed categories] | crossed categories * embedding size |\n",
        "\n",
        "2. Let's start with all the data in as simply as possible: numerical columns for numerical values, categorical (one-hot encoded) columns for categorical data like the day of the week or the hour of the day. Try training...\n",
        " * RSME flat at 8-9 ... not good\n",
        "3. Try to replace the numerical latitude and longitudes by their bucketized versions\n",
        " * RSME trains to 6 ... progress!\n",
        "4. Try to add an engineered feature like 'euclidean' for the distance traveled by the taxi\n",
        " * RMSE trains down to 4-5 ... progress !\n",
        " The euclidian distance is really hard to emulate for a neural network. Look through the code to see how it was \"engineered\".\n",
        "5. Now add embedded crossed columns for:\n",
        "  * hourofday x dayofweek\n",
        "   * pickup neighborhood (bucketized pickup lon x bucketized pickup lat)\n",
        "   * dropoff neighborhood (bucketized dropoff lon x bucketized dropoff lat)\n",
        "   * is this better ?\n",
        "   \n",
        "The big wins were bucketizing the coordinates and adding the euclidian distance. The cross column add only a little, and only if you train for longer. Try training on 10x the training and validation data. With crossed columns you should be able to reach RMSE=3.9"
      ]
    },
    {
      "metadata": {
        "id": "F0qPAxfnWYaj",
        "colab_type": "code",
        "outputId": "c4d9e58d-ef0c-4121-af89-3d5ebabf0efe",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 340
        }
      },
      "cell_type": "code",
      "source": [
        "NB_BUCKETS = 16\n",
        "latbuckets = np.linspace(38.0, 42.0, NB_BUCKETS).tolist()\n",
        "lonbuckets = np.linspace(-76.0, -72.0, NB_BUCKETS).tolist()\n",
        "\n",
        "\n",
        "# the columns you can play with\n",
        "\n",
        "# Categorical columns are used as:\n",
        "# fc.indicator_column(dayofweek)\n",
        "dayofweek = fc.categorical_column_with_vocabulary_list('dayofweek', vocabulary_list = ['Sun', 'Mon', 'Tues', 'Wed', 'Thu', 'Fri', 'Sat'])\n",
        "hourofday = fc.categorical_column_with_identity('hourofday', num_buckets = 24)\n",
        "\n",
        "# Bucketized columns can be used as such:\n",
        "bucketized_pick_lat = fc.bucketized_column(fc.numeric_column('pickuplon'), lonbuckets)\n",
        "bucketized_pick_lon = fc.bucketized_column(fc.numeric_column('pickuplat'), latbuckets)\n",
        "bucketized_drop_lat = fc.bucketized_column(fc.numeric_column('dropofflon'), lonbuckets)\n",
        "bucketized_drop_lon = fc.bucketized_column(fc.numeric_column('dropofflat'), latbuckets)\n",
        "\n",
        "# Cross columns are used as\n",
        "# fc.embedding_column(day_hr, 5)\n",
        "day_hr =  fc.crossed_column([dayofweek, hourofday], 24 * 7)\n",
        "pickup_cross  = fc.crossed_column([bucketized_pick_lat, bucketized_pick_lon], NB_BUCKETS * NB_BUCKETS)\n",
        "drofoff_cross = fc.crossed_column([bucketized_drop_lat, bucketized_drop_lon], NB_BUCKETS * NB_BUCKETS)\n",
        "#pickdorp_pair  = fc.crossed_column([pickup_cross, ddropoff_cross], NB_BUCKETS ** 4 )\n",
        "  \n",
        "columns = [\n",
        "    \n",
        "    ###\n",
        "    #\n",
        "    # YOUR FEATURE COLUMNS HERE\n",
        "    #\n",
        "    fc.numeric_column('passengers'),\n",
        "    ##\n",
        "]\n",
        "\n",
        "l = tf.keras.layers\n",
        "model = tf.keras.Sequential(\n",
        "    [\n",
        "        fc.FeatureLayer(columns),\n",
        "        l.Dense(100, activation='relu'),\n",
        "        l.Dense(64, activation='relu'),\n",
        "        l.Dense(32, activation='relu'),\n",
        "        l.Dense(16, activation='relu'),\n",
        "        l.Dense(1, activation=None), # regression\n",
        "    ])\n",
        "\n",
        "def rmse(y_true, y_pred): # Root Mean Squared Error\n",
        "  return tf.sqrt(tf.reduce_mean(tf.square(y_pred - y_true)))\n",
        "\n",
        "def mae(y_true, y_pred): # Mean Squared Error\n",
        "  return tf.reduce_mean(tf.abs(y_pred - y_true))\n",
        "  \n",
        "model.compile(optimizer=tf.train.AdamOptimizer(), # little bug: in eager mode, 'adam' is not yet accepted, must spell out tf.train.AdamOptimizer()\n",
        "              loss='mean_squared_error',\n",
        "              metrics=[rmse])\n",
        "\n",
        "# print model layers\n",
        "model.predict(one_item, steps=1) # little bug: with FeatureLayer, must call the model once on dummy data before .summary can work\n",
        "model.summary()"
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "feature_layer_1 (FeatureLaye multiple                  0         \n",
            "_________________________________________________________________\n",
            "dense_5 (Dense)              multiple                  200       \n",
            "_________________________________________________________________\n",
            "dense_6 (Dense)              multiple                  6464      \n",
            "_________________________________________________________________\n",
            "dense_7 (Dense)              multiple                  2080      \n",
            "_________________________________________________________________\n",
            "dense_8 (Dense)              multiple                  528       \n",
            "_________________________________________________________________\n",
            "dense_9 (Dense)              multiple                  17        \n",
            "=================================================================\n",
            "Total params: 9,289\n",
            "Trainable params: 9,289\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "qwlP-V2yulrl",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 289
        },
        "outputId": "ff07796b-c8e7-4de6-a188-599e87c1c83e"
      },
      "cell_type": "code",
      "source": [
        "EPOCHS = 8\n",
        "BATCH_SIZE = 512\n",
        "TRAIN_SIZE = 64*1024  # max is 2,141,023\n",
        "VALID_SIZE = 4*1024   # max is 2,124,500\n",
        "\n",
        "# Playground settings: TRAIN_SIZE = 64*1024, VALID_SIZE = 4*1024\n",
        "# Solution settings: TRAIN_SIZE = 640*1024, VALID_SIZE = 64*1024\n",
        "\n",
        "# This should reach RMSE = 3.9 (multiple runs may be necessary)\n",
        "\n",
        "train_dataset = prepare_dataset(load_dataset(TRAIN_DATA_PATTERN), batch_size=BATCH_SIZE, truncate=TRAIN_SIZE)\n",
        "valid_dataset = prepare_dataset(load_dataset(VALID_DATA_PATTERN), batch_size=BATCH_SIZE, truncate=VALID_SIZE, shuffle=False)\n",
        "\n",
        "history = model.fit(train_dataset, steps_per_epoch=TRAIN_SIZE//BATCH_SIZE, epochs=EPOCHS, shuffle=True,\n",
        "                    validation_data=valid_dataset, validation_steps=VALID_SIZE//BATCH_SIZE)"
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/8\n",
            "128/128 [==============================] - 20s 157ms/step - loss: 187.0750 - rmse: 13.4228 - val_loss: 59.7003 - val_rmse: 7.3774\n",
            "Epoch 2/8\n",
            "128/128 [==============================] - 2s 19ms/step - loss: 136.8302 - rmse: 11.4675 - val_loss: 52.0826 - val_rmse: 6.8467\n",
            "Epoch 3/8\n",
            "128/128 [==============================] - 2s 19ms/step - loss: 123.6562 - rmse: 10.8938 - val_loss: 47.9557 - val_rmse: 6.5524\n",
            "Epoch 4/8\n",
            "128/128 [==============================] - 2s 19ms/step - loss: 119.1638 - rmse: 10.6985 - val_loss: 47.9505 - val_rmse: 6.5567\n",
            "Epoch 5/8\n",
            "128/128 [==============================] - 2s 19ms/step - loss: 119.1454 - rmse: 10.7169 - val_loss: 47.3986 - val_rmse: 6.4993\n",
            "Epoch 6/8\n",
            "128/128 [==============================] - 2s 19ms/step - loss: 119.1191 - rmse: 10.6777 - val_loss: 47.8205 - val_rmse: 6.5445\n",
            "Epoch 7/8\n",
            "128/128 [==============================] - 2s 19ms/step - loss: 119.3316 - rmse: 10.7100 - val_loss: 47.7658 - val_rmse: 6.5388\n",
            "Epoch 8/8\n",
            "128/128 [==============================] - 2s 19ms/step - loss: 119.0250 - rmse: 10.6859 - val_loss: 47.6381 - val_rmse: 6.5254\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "t5Ty-HFjWbPM",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 767
        },
        "outputId": "1b4b2fd1-90bc-4bef-8610-917935cbc785"
      },
      "cell_type": "code",
      "source": [
        "print(history.history.keys())\n",
        "display_training_curves(history.history['rmse'], history.history['val_rmse'], 'accuracy', 211)\n",
        "display_training_curves(history.history['loss'], history.history['val_loss'], 'loss', 212)"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "dict_keys(['val_loss', 'val_rmse', 'loss', 'rmse'])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nokVyu9267777rC4FAILCqAYAoNUdOXJEf/vb33T99ddbXQoABI3gDABoVe+8847Gjh2rW265RR06\ndLC6HAAIGqMaAAAAQBA44gwAAAAEgeAMAAAABKFNno6u5ipdrc3pdKqystKS54509NYc9NU89NYc\n9NU89NYc9NU8VvW2vLy82XUccf4BuLKVeeitOeireeitOeireeitOeirecKxt+FXEQAAABCGCM4A\nAABAEAjOAAAAQBAIzgAAAEAQCM4AAABAEAjOAAAAQBAIzgAAAEAQCM4AAAAIK//617+C2u6ZZ57R\nvn37TK6mFsEZAAAAYSM3N1cffPBBUNtOmDBBWVlZJldUq01echsAAACRaebMmdq4caN69eqln//8\n58rNzdW8efP0+OOP6+DBgyorK9Pdd9+tCy+8ULfffrseffRR/etf/1JJSYl2796tvXv36uGHH9b5\n558f8toIzkHy+vzaX1Ci1ASn1aUAAAC0ikUfbNWXGw6EdJ/n9muvW67s1ez6W2+9VUuWLFGvXr20\nY8cOLVy4UIWFhTr33HM1cuRI7du3Tw888IAuvPDCeo87cOCAXnrpJf373//WW2+9RXC20j9X7dH8\nv2/R9Rd31w2XZcswDKtLAgAAiGh9+/aVJLVr106bNm3S22+/LcMwVFRU1GjbQYMGSZIyMzNVUlJi\nSj0E5yAN65Op97/Yo7c/zZG7uEJ3jewju50RcQAAELluubLXCY8Om83prPpL//vvv6+ioiK9/vrr\nKioq0pgxYxpt63DUxlq/329KPSS/IKUmRuuZX49Q1zPb6eOv9+l3S9aqotJrdVkAAAARxTAMeb31\nM5bb7VaHDh1ks9n08ccfq7Ky0pLaCM4/QHJCtKbdMUx9u6Vo9eZDmvHHr3WszJp/OAAAgEjUrVs3\nbdmyRcXFxYFll112mVasWKE77rhDMTExyszM1CuvvNLqtRlut9ucY9kmio6OtuR5XS6XKioqVOnx\n6fdvrteXGw+oU/t4Tbr1R0ppZ01NkaKmtwgt+moeemsO+moeemsO+moeq3pbXl7e7DqOOLeA02HT\n/TcM0BXDO2nPgRJNfGWl9hccs7osAAAAmIjg3EJ2m6Fxv+itGy47S/nuck16ZaV27Gv8CU8AAABE\nBoLzKTAMQ6Mu6a7x156tkrJKTX1ttdZ9V2B1WQAAADABwTkEfjK0ox64cZC8Pr+eWrRG/1633+qS\n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\ntsvlsuR5Twena29dLpdGDIzXiIEdJVXNR6/7Ll9rv8vXuu35+r+1efq/tXmSpA7p8RrYI10De6Sr\nX/c0xcWcfD76dO1ra6C35qCv5qG35qCv5rGit2F1xDkUKisrLXle/hxjHnpbKyHGphH9MzWif6b8\nfr/2Hiypvix41Xz0Pz7fpX98vks2Q8rOSlS/7DQNaGY+mr6ah96ag76ah96ag76aJxx72yaDM3C6\nMAxDndonqFP7BF11XpfAfHTNFQ2/21ek7XuL9PanOXI57erTNbn6tHdp6tw+3uryAQCIKK3+4cAt\nW7Zo9uzZysvLk8PhUHp6uoYNG6bVq1dr48aN6t27t/r166f77ruv2X3w4cDIQ29bprTco827Dmvd\njgJt2FGoffm1549OjItS3+5pSk5wKjHepeQElxLjo5QY71JSfJTaxUWFzRUO2yJes+agr+aht+ag\nr+YJxw8HcgGUH4D/OcxDb0OjsKi83vmjjxSfuKftYqtCdWJ8lJLiXUpMqPqaVCdg16wnZNfHa9Yc\n9NU89NYc9NU84RicGdUAIkhqYrQuGtxBFw3uIL/fr5Jyvw4WFquopELukuNyl1SoqLj6a/X9I8UV\n2nuo5KT7TqgO2VVhOkpJCa6qsB1fP2wTsgEAkYrgDEQowzCUlhSthJiTh9hKj09Hjx3XkeKKQMgu\nqg7XVcuq7ruLK7QviJAdH+NUUnW4DhzNrg7WyXWWtYuL4oIvAIA2g+AMQE6HTamJ0UGdJ7omZNc9\nau0urr1d9fV4VciuM3PdnJqQXXdkJCmh/qhIzVdCNgDASgRnAD9IS0J2vVGRBiMjNUe3gw3ZiTWj\nIvGuenPZDUdGCNkAgFAjOAMwzQ8J2R5v9ZHs4towHfhaZy67qKRCuUGE7LhoR+BodcORkYbz2YRs\nAEAwCM4AwoLDblNKu2iltPsBIbvRLHZN2K6dyc4rPCb/Sc4dFBvtaPJsIkkNjmYnxkcpymkP0Xfc\nNL/fL5+/+qvPL79f8vmrvlat88vnq7pdb1t/g2191dv66+/T75d8Pn9Q+6zZX00dNet81dvVfb6m\n9lmz3N/wMY22rV1vs9klv092u00OmyGb3ZDDZpPdbshuq/7PbpPdZshhN2Svu656edU6m2xNbNNo\nuc0IrDMMw9R/W4QXv98vr6/qP1/1f3Xve32+Jtc1XGa3O+TxeGSzSTbDkM1W/Z9hyGao9nbd5dXb\n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\n0NUL05J8oVPdDTshTTHf8uqFx1tfOxO9NYO+mkNvzaCv5hCcOwjBOfocz72trG66euGqTflas6lA\nFVVNVy/0x7g1fGCGxgzJ1OiTM5WccPRXLzye+2oavTWDvppDb82gr+YQnDsIwTn60NsmDQ2N+vKb\nQOgsHXsKKyU1cDWDQgAAIABJREFUXb1wUJ+UplPdDc5S76x4W0s66Ks59NYM+moOvTWDvppDcO4g\nBOfoQ28Pb3dBhVZvKlBObr427ShR88UL1T0tTqOHZGrs4CwN7t/21Qvpqzn01gz6ag69NYO+mkNw\n7iAE5+hDb4+svLJWa74s0OrcAq39qkBVNQ2SpHi/RyMHZWrMkCyNHJSh+FZXL6Sv5tBbM+irOfTW\nDPpqDsG5gxCcow+9PTp19Y36YluxcnLztWpTvgoDTX/J3S5LQ/qnauyQpg8Y9u2RSl8N4TVrBn01\nh96aQV/NITh3EIJz9KG3xy4YDGrH3vLQJcC/3nXg6oU9M+KVlRqr1CSf0pL8Skv0KS3Zr9REn9KT\nfEpK8DlyRcNowGvWDPpqDr01g76aE4nBuXMuXwbAGMuy1L9Hkvr3SNKl552o4rJq5XxZoNW5+dq0\nI6A9hfvbfKzLZSklIaYpVCf5lJroV1qyT2mJPqUm+ZWe1PQ13u/p0PNLAwDQFTHjfBR4V2kOvTXD\n5/OptHy/SspqVFxWo+KyahWXN30tabldVqOS8hrV1Te2uZ8Yr0tpic3humX2uvlraqJP6cl+pST6\n5PuW553uSnjNmkFfzaG3ZtBXc5hxBtDp/DEe9cjwqEdGfJtjgsGgKqrqVFRao5Ly6lDILgkL2zXK\n3VGiYDtvtRNiveHhOrE5XLcK28ksDwEAdFEEZwCyLEuJcTFKjItR/x6JbY5raGhUoKI2NFN9YMa6\n5XaNCkur9c2+ijb34bKklMQDs9WhZSIHrcNmeQgAINIYDc5btmzRTTfdpMmTJ2vSpEnat2+f7r33\nXtXX18vj8eiee+5RRkaGVqxYoaVLl8rlculHP/qRJkyYYLIsAMfI7XYpPdmv9OT2l0tV19aHloeU\nlFerqKxGJWUHwnVxWbV27C0P+yDjwVqWhzQFal/4OuykAzPZx9PyEACAs446ONfW1qqkpETdunVr\nd1xVVZXmzp2rsWPHhrY9+eST+tGPfqTvfe97euWVV/Rf//Vfmj59up599lk999xz8ng8uuqqq3Tu\n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\n",
            "text/plain": [
              "<Figure size 720x720 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "L9SJkpi8j-mR",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}